import store from '@/store';
import { Toast } from 'antd-mobile';
import axios, { AxiosError } from 'axios';
import history from './history';
import { getToken, setToken } from './storage';
import { removeToken } from '@/utils/storage';
import { clearTokenAction } from '@/store/action/user';
export const baseURL = 'http://geek.itheima.net';

const request = axios.create({
  baseURL,
  timeout: 5000,
});

// 添加请求拦截器
request.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么
    const { token } = getToken();
    // console.log(token);
    if (token) {
      //这里config类型为any，不一定有headers属性，后面加个！表示一定有这个属性（此时我们比系统更了解，所以可以这么做）
      config.headers!.Authorization = `Bearer ${token}`;
    }
    // console.log(config.headers);

    return config;
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
request.interceptors.response.use(
  (response) => {
    // 对响应数据做点什么
    return response.data;
  },
  async (error: AxiosError<{ message: string }>) => {
    if (!error.response) {
      Toast.show({ content: '网络繁忙，请稍后重试', duration: 1000 });
      return Promise.reject(error);
    }
    const { config, response } = error;
    const { token, refresh_token } = getToken();
    if (response.status !== 401) {
      // 不是token失效的问题
      Toast.show({ content: response.data.message, duration: 1000 });
      return Promise.reject(error);
    }

    if (response.status === 401) {
      //没有token或者刷新token就跳转登录，并带上当前路由参数
      if (!token || !refresh_token) {
        history.replace('/login', {
          from: history.location.pathname || '/home',
        });
      }
      try {
        const res = await axios({
          url: baseURL + '/v1_0/authorizations',
          method: 'put',
          headers: {
            Authorization: `Bearer ${refresh_token}`,
          },
        });
        console.log(48, res);

        const tokenInfo = {
          token: res.data.data.token,
          refresh_token: refresh_token,
        };
        store.dispatch({ type: 'user/login', payload: tokenInfo }); //保存token到redux中
        setToken(tokenInfo); //保存token到本地
        return request(config); //重新发起刚开始失败的请求
      } catch {
        //若捕获异常，则清除本地及redux的token，在跳转登录
        removeToken();
        store.dispatch(clearTokenAction());
        history.replace({
          pathname: '/login', //跳转路径
          state: {
            from: history.location.pathname, //原路径
          },
        });
        Toast.show({ content: '登录信息失效，请重新登录', duration: 1000 });
        return Promise.reject(error);
      }
    }
    // 对响应错误做点什么
    // return Promise.reject(error);
  }
);

export default request;
